/*
 * calculator program that provides the operators +, -, *
 */

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100


int getop(char* s);
void push(double value);
double pop(void);

int main (int argc, const char** argv)
{
    int type;
    double op2;
    char s[MAXOP];
  
    while ((type = getop(s)) != 'Q'){
      switch (type){
      case NUMBER:
        push(atof(s));
        break;
      case '+':
        push(pop() + pop());
        break;
      case '*':
        push(pop() * pop());
        break;
      case '-':
        op2 = pop();
        push(pop() - op2);
        break;
      case '/':
        op2 = pop();
        if (op2 != 0.0){
          push(pop() / op2);
        } else 
          printf ("error: zero devisor\n");
        break;
      case '\n':
        printf ("\t%.8g\n", pop());
        break;
      default:
        printf ("error: uknow command %s\n", s);
        break;
      }
    }
    return 0;

}
int sp = 0;
double val[MAXVAL];

void push(double f){
    if (sp < MAXVAL){
      val[sp++] = f;
    }else
      printf ("error: stack full, can't push  %g\n", f);
}

double pop (void){
   if (sp > 0){
     return val[--sp];
   }else {
     printf ("error: stack empty\n");
     return 0.0;
   }
}

int getch(void);
void ungetch(int);

int getop(char* s)
{
    int i,c;

    while ((s[0] = c = getch()) == ' ' || c == '\t'){
      ;
    }
    s[1] = '\0';
    if (!isdigit(c) && c != '.'){
      return c;
    }
    i = 0;
    if (isdigit(c)){
      while (isdigit(s[++i] = c = getch())){
      ;
      }
    }
    if (c == '.'){
      while (isdigit(s[++i] = c = getch())){
        ;
      }
    }      
    s[i] = '\0';
      
    if (c != EOF){
      ungetch(c);
    }
    return NUMBER;
}

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;
/* buffer for ungetch */
/* next free position in buf */
int getch(void) /* get a (possibly pushed-back) character */
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c)
/* push character back on input */
{
    if (bufp >= BUFSIZE)
      printf("ungetch: too many characters\n");
    else
      buf[bufp++] = c;
}

